package com.hongshan.wallet

import android.content.ContextWrapper
import android.content.SharedPreferences
import android.databinding.ObservableField
import com.alibaba.android.arouter.launcher.ARouter
import com.elvishew.xlog.LogConfiguration
import com.elvishew.xlog.LogLevel
import com.elvishew.xlog.XLog
import com.elvishew.xlog.flattener.DefaultFlattener
import com.elvishew.xlog.formatter.border.DefaultBorderFormatter
import com.elvishew.xlog.formatter.message.json.DefaultJsonFormatter
import com.elvishew.xlog.formatter.message.throwable.DefaultThrowableFormatter
import com.elvishew.xlog.formatter.message.xml.DefaultXmlFormatter
import com.elvishew.xlog.formatter.stacktrace.DefaultStackTraceFormatter
import com.elvishew.xlog.formatter.thread.DefaultThreadFormatter
import com.elvishew.xlog.printer.AndroidPrinter
import com.elvishew.xlog.printer.file.FilePrinter
import com.elvishew.xlog.printer.file.backup.FileSizeBackupStrategy
import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator
import com.hongshan.wallet.bean.UserBean
import com.hongshan.wallet.bean.UserDescBean
import com.kingja.loadsir.callback.HintCallback
import com.kingja.loadsir.callback.ProgressCallback
import com.kingja.loadsir.core.LoadSir
import com.scwang.smartrefresh.layout.SmartRefreshLayout
import com.scwang.smartrefresh.layout.footer.ClassicsFooter
import com.scwang.smartrefresh.layout.header.ClassicsHeader
import com.squareup.leakcanary.LeakCanary
import me.goldze.mvvmhabit.base.BaseApplication
import kotlin.properties.Delegates




/**
 * Copyright Qiandai Ltd.
 * Copyright (c) 2019
 * All rights reserved
 *
 * @project  : Wallet
 * @package  : com.example.wallet
 * @author   : Administrator
 * @data     : 2019/3/18
 * @email    : zhangxx@baihang-china.com
 */
class MyApplication : BaseApplication() {

    override fun onCreate() {
        super.onCreate()
        if (LeakCanary.isInAnalyzerProcess(this)) {
            return
        }
        sp = getSharedPreferences(Constant.SP.SP_NAME,ContextWrapper.MODE_PRIVATE)
        MyApplication.applicationContext = this
        if (BuildConfig.DEBUG) {
            ARouter.openLog()
            ARouter.openDebug()
        }
        ARouter.init(this)
        initLog()
        LeakCanary.install(this)
        initRefreshLayout()
        LoadSir.beginBuilder()
            .addCallback(
                ProgressCallback.Builder()
                    .setTitle("Loading")
                    .build()
            )
            .addCallback(
                HintCallback.Builder()
                    .setTitle("Error")
                    .setSubTitle("Sorry, buddy, I will try it again.")
                    .setHintImg(R.drawable.customactivityoncrash_error_image)
                    .build()
            )
            .setDefaultCallback(ProgressCallback::class.java)
            .commit()
    }

    private fun initLog() {
        val config = LogConfiguration.Builder()
            .tag("zhang")                                                       // 指定 TAG，默认为 "BindInfo-LOG"
            .logLevel(if (BuildConfig.DEBUG) LogLevel.ALL else LogLevel.NONE)   // 指定日志级别，低于该级别的日志将不会被打印
            .t()                                                                // 允许打印线程信息，默认禁止
            .st(10)                                                             // 允许打印深度为2的调用栈信息，默认禁止
            .b()                                                                // 允许打印日志边框，默认禁止
            .jsonFormatter(DefaultJsonFormatter())                              // 指定 JSON 格式化器，默认为 DefaultJsonFormatter
            .xmlFormatter(DefaultXmlFormatter())                                // 指定 XML 格式化器，默认为 DefaultXmlFormatter
            .throwableFormatter(DefaultThrowableFormatter())                    // 指定可抛出异常格式化器，默认为 DefaultThrowableFormatter
            .threadFormatter(DefaultThreadFormatter())                          // 指定线程信息格式化器，默认为 DefaultThreadFormatter
            .stackTraceFormatter(DefaultStackTraceFormatter())                  // 指定调用栈信息格式化器，默认为 DefaultStackTraceFormatter
            .borderFormatter(DefaultBorderFormatter())                          // 指定边框格式化器，默认为 DefaultBorderFormatter
            .build()

        val androidPrinter = AndroidPrinter()                                   // 通过 android.util.Log 打印日志的打印器
        val filePrinter = FilePrinter.Builder(Constant.FilePath.LOG_PATH)
            .fileNameGenerator(DateFileNameGenerator())                         // 指定日志文件名生成器，默认为 ChangelessFileNameGenerator("log")
            .backupStrategy(FileSizeBackupStrategy(Constant.FileSize.MB * 2))   // 指定日志文件备份策略，默认为 FileSizeBackupStrategy(1024 * 1024)
            .flattener(DefaultFlattener())                                      // 指定日志平铺器，默认为 DefaultLogFlattener
            .build()

        XLog.init(
            config,                                                             // 指定日志配置，如果不指定，会默认使用 new LogConfiguration.Builder().build()
            androidPrinter,                                                     // 添加任意多的打印器。如果没有添加任何打印器，会默认使用 AndroidPrinter
            filePrinter
        )
    }

    fun initRefreshLayout(){
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
            layout.setPrimaryColorsId(R.color.colorPrimary, R.color.white)//全局设置主题颜色
            ClassicsHeader(context)//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header，默认是 贝塞尔雷达Header
        }
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ ->
            //指定为经典Footer，默认是 BallPulseFooter
            ClassicsFooter(context).setDrawableSize(20f)
        }
    }

    companion object {
        var applicationContext by Delegates.notNull<MyApplication>()
        var user:UserBean? = null
        var sp by Delegates.notNull<SharedPreferences>()
        var userInfo = ObservableField<UserDescBean>()
    }
}